var CONFIG = require('../../../../../common/config');
var CODE = require('../../../../../common/code');
var async = require('async');
var moment = require('moment');
var retUtil = require('../../../../yjx/v1/util/retUtil');
var ItbUserModel=require('../../../../../common/mysql/mapping/ItbUserModel');
var TgOrgRModel=require('../../../../../common/mysql/mapping/TgOrgRModel');

var usersUtil = (function () {
    function usersUtil() {

    }

    /**
     * 用户登录
     *
     * @author 王俊
     * @date 2018-4-12
     *
     * @param  {Object} options 参数
     * @param  {String} options.accName 参数
     * @param  {String} options.accPsw 参数
     * @param   callback 回调
     *              err 错误信息
     *              data 返回数据
     * */
    usersUtil.userLogin = function(options, callback){
        var entity =  new ItbUserModel();
        var opt = {
            queryType : 1,
            userName : options.accName,
            password : options.accPsw
        };
        entity.getBackUserInfo(opt, function(error, userInfo){
            if(error || !userInfo){
                return callback(error || '用户名或密码错误或用户不存在',null);
            }
            // 非设计组织下用户
            if(!userInfo.yjscDesignPlatformInfo) {
                return callback(error || '权限不足登录失败',null);
            }
            return callback(null,userInfo)
        });
    };

    /**
     * 创建单个后台用户
     *
     * @author 王俊
     * @date 2018-04-12
     *
     * @param {Object} options 请求参数
     * @param {Number} options.userId 用户 id
     * @param {Object} options.accName 创建账户名
     * @param {Object} options.accPsw 创建账户密码, md5后
     * @param {Number} options.role 创建用户角色
     * @param {Number} [options.joinUserId] 若用户存在, 加入当前组织的确认用户 id
     * @param {Function} callback 回调函数
     */
    usersUtil.createUser = function (options, callback) {

        var totalTasks = [];

        // 确认权限
        totalTasks.push(function (callback) {
            var entity = new ItbUserModel();
            var opt = {
                queryType : 2,
                userId : options.userId
            };
            entity.getBackUserInfo(opt, function (error, userInfo) {
                if (error || !userInfo || !userInfo) {
                    return callback(error || '用户不存在或权限不足');
                }
                if(!userInfo.yjscDesignPlatformInfo) {
                    return callback('权限不足, 操作失败');
                }
                // 用户角色(多角色用户按位与): 0普通用户, 1一级管理员, 2二级管理员, 4三级管理员, 8超级管理员, 16设计人员, 32模版操作员, 64印刷对接员, 128客服 , 256测试员, 512市场人员, 1024环信客服
                // 管理员 1+2+4+8 = 15

                if((userInfo.yjscDesignPlatformInfo.role & 15) <=0) {
                    return callback('权限不足, 创建用户失败', null);
                }
                if(options.role !== 16) {
                    return callback('权限不足, 创建该角色用户失败', null);
                }
                var data = {};
                data.userInfo = userInfo;
                return callback(error, data);
            });
        });
        // 2. 过滤用户名, 若用户已存在且不加入当前组织则返回识别
        totalTasks.push(function (data, callback) {

            var entity = new ItbUserModel();
            var opt = {
                queryType : 3,
                userName : options.accName
            };
            entity.getBackUserInfo(opt, function (error, userInfo) {
                if(error || userInfo) {
                    return callback(error || '该用户已存在');
                }
                // 用户不存在
                data.needInserUser = true;          // 需要新添加用户
                data.needRefreshNewUserInfo = true; // 最终需要刷新用户信息
                return callback(null, data);
            });
        });
        // 3. 按需创建用户
        totalTasks.push(function (data, callback) {
            if(!data.needInserUser) {
                return callback(null, data);
            }
            var entity = new ItbUserModel({
                user_name : options.accName,
                password : options.accPsw,
                nickname : options.accName,
                update_by : options.userId,
                user_type : 0  // 标记后台用户
            });
            entity.saveToDB(function (error, userId) {
                if (error) {
                    return callback(error, data);
                }
                data.joinUserId = userId;
                data.needRefreshNewUserInfo = true;
                return callback(error, data);
            });
        });
        // 4. 加入组织并设置角色
        totalTasks.push(function (data, callback) {
            if(!data.joinUserId) {
                return callback(null, data);
            }
            var entity = new TgOrgRModel({
                org_id : data.userInfo.yjscDesignPlatformInfo.orgId,
                user_id : data.joinUserId,
                role : options.role,
                state : 10,
                update_by : options.userId
            });
            entity.saveToDB(function (error, rId) {
                data.needRefreshNewUserInfo = true;
                return callback(error, data);
            });
        });
        // 5. 按需获取新加入用户信息
        totalTasks.push(function (data, callback) {
            if(!data.needRefreshNewUserInfo) {
                return callback(null, data);
            }
            var entity = new ItbUserModel();
            var opt = {
                queryType : 2,
                userId : data.joinUserId
            };
            entity.getBackUserInfo(opt, function (error, userInfo) {
                data.newUserInfo = userInfo;
                return callback(error, data);
            });
        });
        async.waterfall(totalTasks, function (error, data) {
            var newUserInfo = data ? data.newUserInfo : null;
            return callback(error, newUserInfo);
        });
    };

    /**
     * 管理员删除组织内用户
     *
     * @author 王俊
     * @date 2018-04-12
     *
     * @param {Object} options 删除用户参数
     * @param {Number} options.userId 用户标识
     * @param {Number} options.delUserId 要删除的用户标识
     * @param {Function} callback 回调
     */
    usersUtil.adminRemoveUserFromOrg = function (options, callback) {
        var totalTask = [];
        // 1. 获取用户信息
        totalTask.push(function (callback) {
            var entity = new ItbUserModel();
            var opt = {
                queryType : 2,
                userId : options.userId
            };
            entity.getBackUserInfo(opt, function (error, userInfo) {
                if (error || !userInfo) {
                    return callback(error || '用户不存在或权限不足');
                }
                if(!userInfo.yjscDesignPlatformInfo) {
                    return callback('权限不足')
                }
                var data = {};
                data.userInfo = userInfo;
                // 用户角色(多角色用户按位与): 0普通用户, 1一级管理员, 2二级管理员, 4三级管理员, 8超级管理员, 16设计人员, 32模版操作员, 64印刷对接员, 128客服 , 256测试员, 512市场人员, 1024环信客服
                // 管理员 1+2+4+8 = 15
                if((userInfo.yjscDesignPlatformInfo.role & 15) <=0) {
                    return callback('权限不足, 操作失败失败', null);
                }
                return callback(error, data);
            });
        });
        // 2. 获取待移出组织的用户信息
        totalTask.push(function (data, callback) {
            var entity = new ItbUserModel();
            var opt = {
                queryType : 2,
                userId : options.delUserId
            };
            entity.getBackUserInfo(opt, function (error, userInfo) {
                if (error || !userInfo) {
                    return callback(error || '用户不存在或权限不足');
                }
                if(!userInfo.yjscDesignPlatformInfo) {
                    return callback('该用户不在当前组织内, 操作失败', null);
                }

                data.removeUserInfo = userInfo;
                // 用户角色(多角色用户按位与): 0普通用户, 1一级管理员, 2二级管理员, 4三级管理员, 8超级管理员, 16设计人员, 32模版操作员, 64印刷对接员, 128客服 , 256测试员, 512市场人员, 1024环信客服
                // 管理员 1+2+4+8 = 15
                // 被删用户不能是管理员
                if(data.removeUserInfo.yjscDesignPlatformInfo.role & 15) {
                    return callback('权限不足, 操作失败失败', null);
                }
                if (data.userInfo.yjscDesignPlatformInfo.orgId !== data.removeUserInfo.yjscDesignPlatformInfo.orgId) {
                    return callback('权限不足, 操作失败失败', null);
                }
                return callback(error, data);
            });
        });
        // 3. 移出组织
        totalTask.push(function (data, callback) {
            var entity = new TgOrgRModel();
            entity.invalidateUserOrgRelation(data.removeUserInfo.yjscDesignPlatformInfo.orgId, data.removeUserInfo.userId, function (error) {
                return callback(error, data);
            })
        });
        async.waterfall(totalTask, function (error, data) {
            return callback(error, data);
        });
    };

    /**
     * 管理员重置用户密码
     *
     * @author 王俊
     * @date 2018-04-12
     *
     * @param {Object} options 删除用户参数
     * @param {Number} options.userId 用户标识
     * @param {Number} options.updUserId 要删除的用户标识
     * @param {String} options.updPsw 要删除的用户标识
     * @param {Function} callback 回调
     */
    usersUtil.adminResetUserPsw = function (options, callback) {
        var totalTask = [];
        // 1. 获取用户信息
        totalTask.push(function (callback) {
            var entity = new ItbUserModel();
            var opt = {
                queryType : 2,
                userId : options.userId
            };
            entity.getBackUserInfo(opt, function (error, userInfo) {
                if (error || !userInfo) {
                    return callback(error || '用户不存在或权限不足');
                }
                if(!userInfo.yjscDesignPlatformInfo) {
                    return callback('权限不足')
                }
                var data = {};
                data.userInfo = userInfo;
                // 用户角色(多角色用户按位与): 0普通用户, 1一级管理员, 2二级管理员, 4三级管理员, 8超级管理员, 16设计人员, 32模版操作员, 64印刷对接员, 128客服 , 256测试员, 512市场人员, 1024环信客服
                // 管理员 1+2+4+8 = 15
                if((userInfo.yjscDesignPlatformInfo.role & 15) <=0) {
                    return callback('权限不足, 操作失败失败', null);
                }
                return callback(error, data);
            });
        });
        // 2. 获取待移出组织的用户信息
        totalTask.push(function (data, callback) {
            var entity = new ItbUserModel();
            var opt = {
                queryType : 2,
                userId : options.updUserId
            };
            entity.getBackUserInfo(opt, function (error, userInfo) {
                if (error || !userInfo) {
                    return callback(error || '用户不存在或权限不足');
                }
                if(!userInfo.yjscDesignPlatformInfo) {
                    return callback('该用户不在当前组织内, 操作失败', null);
                }
                data.updUserInfo = userInfo;
                // 用户角色(多角色用户按位与): 0普通用户, 1一级管理员, 2二级管理员, 4三级管理员, 8超级管理员, 16设计人员, 32模版操作员, 64印刷对接员, 128客服 , 256测试员, 512市场人员, 1024环信客服
                // 管理员 1+2+4+8 = 15
                // 被更新用户不能是管理员
                if(data.updUserInfo.yjscDesignPlatformInfo.role & 15) {
                    return callback('权限不足, 操作失败失败', null);
                }
                if (data.userInfo.yjscDesignPlatformInfo.orgId !== data.updUserInfo.yjscDesignPlatformInfo.orgId) {
                    return callback('权限不足, 操作失败失败', null);
                }
                return callback(error, data);
            });
        });
        // 3. 更新密码
        totalTask.push(function (data, callback) {
             var entity = new ItbUserModel({
                 user_id : options.updUserId,
                 password : options.updPsw,
                 update_by : options.userId
             });
             entity.updateToDB(function (error) {
                 return callback(error, data);
             });
        });
        async.waterfall(totalTask, function (error, data) {
            return callback(error, data);
        });
    };

    /**
     * 获取某组织下所有用户
     *
     * @author 王俊
     * @date 2018-04-12
     *
     * @param {Object} options 请求参数
     * @param {Number} options.userId 管理员用户标识
     * @param {Array} options.roles 要查询的角色列表
     * @param {Array} [options.userNames] 昵称限定数组
     * @param {Number} options.pageNum 请求参数
     * @param {Number} options.pageSize 请求参数
     * @param {Number} options.withTotalPage 请求参数
     * @param {Function} callback 回调函数
     *                      err: 查询失败
     *                      data : {
     *                          list: 用户列表
     *                      }
     */
    usersUtil.adminGetOrgUsersList = function (options, callback) {
        var totalTasks = [];
        // 1. 确认权限
        totalTasks.push(function (callback) {
            var opt = {
                queryType : 2,
                userId : options.userId
            };
            var entity = new ItbUserModel();
            entity.getBackUserInfo(opt, function (error, userInfo) {
                if(error || !userInfo) {
                    return callback(error || '用户不存在或权限不足', null);
                }
                var data = {};
                data.userInfo = userInfo;
                if(!data.userInfo.yjscDesignPlatformInfo) {
                    return callback('权限不足, 操作失败', data);
                }
                // 用户角色(多角色用户按位与): 0普通用户, 1一级管理员, 2二级管理员, 4三级管理员, 8超级管理员, 16设计人员, 32模版操作员, 64印刷对接员, 128客服 , 256测试员, 512市场人员, 1024环信客服
                // 管理员 1+2+4+8 = 15
                // 被更新用户不能是管理员
                if((data.userInfo.yjscDesignPlatformInfo.role & 15) <= 0) {
                    return callback('权限不足, 操作失败', data);
                }
                return callback(error, data);
            });
        });
        // 2. 获取用户列表
        totalTasks.push(function (data, callback) {
            var entity = new TgOrgRModel();
            var opt = {
                orgId : data.userInfo.yjscDesignPlatformInfo.orgId,
                roles : options.roles,
                userNames : options.userNames,
                pageNum : options.pageNum,
                pageSize : options.pageSize
            };
            entity.getRolesUserList(opt, function (error, list) {
                data.list = list;
                return callback(error, data);
            });

        });
        // 3. 按需获取总页数总个数
        totalTasks.push(function (data, callback) {
            if(!options.withTotalPage) {
                return callback(null, data);
            }
            var entity = new TgOrgRModel();
            var opt = {
                orgId : data.userInfo.yjscDesignPlatformInfo.orgId,
                roles : options.roles,
                userNames : options.userNames
            };
            entity.getRolesUserListCnt(opt, function (error, totalCnt) {
                data.totalCnt = totalCnt;
                data.totalPage = Math.floor((totalCnt-1)/options.pageSize)+1;
                return callback(error, data);
            })

        });
        async.waterfall(totalTasks, function (error, data) {
            if(error) {
                return callback(error, null);
            }
            var ret = {
                list : data.list,
                totalPage : data.totalPage,
                totalCnt : data.totalCnt
            };
            return callback(error, ret);
        });
    };

    return usersUtil;
})();



module.exports = usersUtil;